package com.xuecheng.media.controller;


import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.vod.model.v20170321.CreateUploadVideoResponse;
import com.aliyuncs.vod.model.v20170321.RefreshUploadVideoResponse;
import com.xuecheng.api.content.model.aliyun.AliyunVodApi;
import com.xuecheng.api.content.model.aliyun.VodUploadRequest;
import com.xuecheng.api.content.model.aliyun.VodUploadToken;
import com.xuecheng.common.exception.ExceptionCast;
import com.xuecheng.media.common.constant.MediaErrorCode;
import com.xuecheng.media.common.utils.AliyunVODUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

/**
 * <p></p>
 *
 * @Description:
 */
@Slf4j
@RestController
public class AliyunVodController implements AliyunVodApi {

    @Value("$(aliyun.region)")
    private String regionId;

    @Value("${aliyun.accessKeyId}")
    private String accessKeyId;

    @Value("${aliyun.accessKeySecret}")
    private String accessKeySecret;

    @PostMapping("media/vod-token")
    public VodUploadToken generateUploadToken(@RequestBody VodUploadRequest request) {
        //获得视频标题
        String requestTitle = request.getTitle();
        //获得视频的文件名
        String fileName = request.getFileName();

        VodUploadToken vodUploadToken = null;

        // PS: 只要和本项目中微服务之外的内容要产生交互，必须要进行try-catch处理
        //   交互方：aliyun（第三方服务）
        //   原因：网络（不稳定因素）
        try {
            DefaultAcsClient client = AliyunVODUtil.initVodClient(regionId, accessKeyId, accessKeySecret);
            //CreateUploadVideoResponse response = client.getAcsResponse(request);
            CreateUploadVideoResponse response = AliyunVODUtil.createUploadVideo(client, requestTitle, fileName);
            vodUploadToken = new VodUploadToken();
            vodUploadToken.setUploadAuth(response.getUploadAuth());
            vodUploadToken.setRequestId(response.getRequestId());
            vodUploadToken.setUploadAddress(response.getUploadAddress());
            vodUploadToken.setVideoId(response.getVideoId());

        } catch (Exception e) {
            // printStackTrace：将程序中的所有调用关系的栈信息进行打印-日志（日志文件-IO）
            // 用户大量请求
            // e.printStackTrace();  //丢工作
            // 异常信息的说明
            // 1.只将错误信息记录
            ExceptionCast.cast(MediaErrorCode.E_140011);
            // 2.将错误信息隐藏并返回友好提示
        }
        return vodUploadToken;
    }

    @GetMapping("media/refresh-vod-token/{videoId}")
    public VodUploadToken refreshUploadToken(@PathVariable String videoId) {
        VodUploadToken vodUploadToken = null;
        // PS: 只要和本项目中微服务之外的内容要产生交互，必须要进行try-catch处理
        //   交互方：aliyun（第三方服务）
        //   原因：网络（不稳定因素）
        try {
            DefaultAcsClient client = AliyunVODUtil.initVodClient(regionId, accessKeyId, accessKeySecret);
            RefreshUploadVideoResponse response = AliyunVODUtil.refreshUploadVideo(client, videoId);
            vodUploadToken = new VodUploadToken();
            vodUploadToken.setUploadAuth(response.getUploadAuth());
            vodUploadToken.setRequestId(response.getRequestId());
            vodUploadToken.setUploadAddress(response.getUploadAddress());
            vodUploadToken.setVideoId(response.getVideoId());

        } catch (Exception e) {
            // printStackTrace：将程序中的所有调用关系的栈信息进行打印-日志（日志文件-IO）
            // 用户大量请求
            // e.printStackTrace();  //丢工作
            ExceptionCast.cast(MediaErrorCode.E_140011);
            // 异常信息的说明
            // 1.只将错误信息记录
            // 2.将错误信息隐藏并返回友好提示

        }
        return vodUploadToken;
    }
}